package com.itlin.filter;

import com.itlin.bean.Employee;
import com.itlin.bean.User;
import com.itlin.utils.BaseContext;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
    登录与否的校验过滤器
        1. 获取客户端访问的请求地址
        2. 判定请求地址是否需要处理
            2.1 如果不需要处理，就直接放行。
                比如： 登录页面：login.html 执行登录的请求：employee/login 退出登录 ： logout
            2.2 如果要处理，就要判定有没有登录
                2.2.1 从session作用域里面取出来 Employee对象 【在前面登录成功的时候，就已经存进去过了】
                    2.2.1.1 如果有对象，那么就认为已经登录过了，此时可以直接放行！
                    2.2.1.2 如果没有对象，那么就认为没有登录，此时要跳转到登录页面！

 */

@WebFilter("/*")
public class LoginFilter implements Filter {

    @Autowired
    private BaseContext baseContext;


    //拦截到请求，就会执行这个方法
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("过滤器拦截到请求了~~");

        HttpServletRequest r = (HttpServletRequest) req;
        HttpServletResponse rs = (HttpServletResponse) resp;

        //1. 获取请求地址  http://localhost:8080/backend/page/login/login.html
        String requestURI = r.getRequestURI();//  只会得到从端口号后面的内容  /backend/page/login/login.html
                         //r.getRequestURL(); //  得到完整的地址  http://localhost:8080/backend/page/login/login.html

        //2. 判定地址要不要处理
        if(requestURI.contains("login") || requestURI.contains("logout")
            || requestURI.contains("js") || requestURI.contains("css")
                || requestURI.contains("images") || requestURI.contains("styles")
                || requestURI.endsWith(".ico") || requestURI.contains("sms")){


            //如果属于不需要校验的请求地址，那么直接放行
            chain.doFilter(req ,resp);
            return ;
        }

        //3. 如果程序运行到了这里，即表示这次请求需要判定！
        //3.1 从session作用域里面获取早前登录的时候，存储的员工对象
        Employee employee = (Employee) r.getSession().getAttribute("employee");

        //3.2 判定对象是否有值
        if(employee != null){

            //判定已经登录过了，那么就把员工对象保存起来
            baseContext.setThreadLocal(employee.getId());

            //如果进入了这里，即表示已经登录过了，就直接放行了！
            chain.doFilter(req , resp);

            return;
        }

        //4. 判定前端的用户是否已经登录了
        User user = (User) r.getSession().getAttribute("user");
        if(user != null){
            //TODO: 这里登录成功了之后，其实也需要把用户信息保存到ThreadLocal里面。以便后续使用id值。

            baseContext.setThreadLocal(user.getId());

            chain.doFilter(req, resp);

            return ;
        }


        rs.sendRedirect("/front/page/login.html");





    }

    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }

}
